停车场管理问题课程设计

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define TRUE 1
#define FALSE 0
#define Stack_Size 2


//车辆信息
typedef struct Car
{
    char Number[20];//车牌号
    int time;//到达时刻
}Car;


//车库栈定义
typedef struct
{
    Car elem[Stack_Size];
    int top;
}SeqStack;


//暂退出车栈道定义
typedef struct
{
    Car elem2[Stack_Size];
    int top2;
}SeqStack2;


//队列定义
typedef struct Node
{
    Car data;//数据域
    struct Node *next;//指针域
}LinkQueueNode;


typedef struct
{
    LinkQueueNode *front;
    LinkQueueNode *rear;
    int length;
}LinkQueue;


//以下是函数原型说明
void InitStack(SeqStack *s);
int IsEmpty(SeqStack *s);
int Push(SeqStack *s,Car e);
int Pop(SeqStack *s,Car *e);
int InitQueue(LinkQueue *Q);
int EmptyQueue(LinkQueue Q);
int EnterQueue(LinkQueue *Q,Car x);
int DeleteQueue(LinkQueue*Q,Car *x);
int CarArrive(SeqStack *s,LinkQueue *Q,char num[],int arrivetime);
int CarLeave(SeqStack *s,LinkQueue *Q,SeqStack *s2,char[],int leavetime);


//以下是函数定义
void InitStack(SeqStack *s)//顺序栈的初始化函数
{
    s->top=-1;
}


int IsEmpty(SeqStack *s)//顺序栈的判栈空函数
{
    if(s->top==-1)
    return(TRUE);
    else
    return(FALSE);
}


int IsFull(SeqStack *s)
{
    if(s->top==Stack_Size)
    return(TRUE);
    else
    return(FALSE);
}


int Push(SeqStack *s,Car *e)//顺序栈的进栈函数
{
    if(s->top==Stack_Size-1)
    return(FALSE);
    else
    {
        s->top++;
        s->elem[s->top]=*e;
        return(TRUE);
    }
}


int Pop(SeqStack *s,Car *e)//顺序栈的出栈函数
{
    if(s->top==-1)
    return(FALSE);
    else
    {
        *e=s->elem[s->top];
        s->top--;
        return(TRUE);
    }
}
int InitQueue(LinkQueue *Q)//链队列的初始化
{
   Q->length=0;
   Q->front=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
   if(Q->front!=NULL)
   {
       Q->rear=Q->front;
       Q->front->next=NULL;
       return(TRUE);
   }
   else
   return(FALSE);//溢出
}
int EmptyQueue(LinkQueue *Q)//链队列的判空
{
    if(Q->front==Q->rear)
    return(TRUE);
    else
    return(FALSE);
}
int EnterQueue(LinkQueue *Q,Car *x)//链队列的入队操作,将数据元素x插到队列中
{


    LinkQueueNode *NewNode;
    NewNode=(LinkQueueNode*)malloc(sizeof(LinkQueueNode));
    if(NewNode!=NULL)
    {
        NewNode->data=*x;


        NewNode->next=NULL;
        Q->rear->next=NewNode;
        Q->rear=Q->rear->next;
        Q->rear->next=NULL;
        Q->length++;
        return(TRUE);
    }
    else
        return(FALSE);//溢出


}
int DeleteQueue(LinkQueue *Q,Car *x) //链队列的出队操作,对头出列,并存放到x所指的储存空间中
{
  LinkQueueNode *p;
  if(Q->front==Q->rear)
     return(FALSE);
  p=Q->front->next;
  Q->front->next=p->next;  //对头元素p出列
  if(Q->rear==p)  //如果对中只有一个元素p,则p出对后成为空队
  Q->rear=Q->front;
  *x=p->data;
  free(p); //释放存储空间
  Q->length--;
     return(TRUE);
}
/***********************************车辆到达函数*************************************/
int CarArrive(SeqStack  *s,LinkQueue  *Q,char num[],int arrivetime)
 {    Car *come;
      come=(Car*)malloc(sizeof(Car));
      strcpy(come->Number,num);//到达车辆的车牌号
      come->time =arrivetime;//到达车辆的时间
      if(s->top<Stack_Size-1) //若车库未满,直接入车库
       {
         Push(s,come);//车辆入栈
         printf("-------------------------------------\n");
         printf("车辆%s停在车库%d号位上\n",num,s->top+1);
 }
 else
 {
     EnterQueue(Q,come);//若车库已满,就入队列
     printf("-------------------------------------\n");
     printf("车辆%s停在便道%d号位上\n",num,Q->length);
       }
    return 0;
}
/**********************************车辆离开函数****************************************/
void Carleave(SeqStack  *s,LinkQueue * Q,char num[],int leavetime)
{
   SeqStack  s2;
   InitStack(&s2 );
   Car *Acar;//要离开车辆
   Acar=(Car*)malloc(sizeof(Car));
   int money,parktime;
   while(!IsEmpty(s)&&(strcmp(s->elem[s->top].Number,num)))
   //当"车库"栈不空,并且栈顶车辆不是要离开的车时,重复下面操作:
   {  // 将"车库"栈的栈顶车辆退出;
    Pop(s, Acar);
    //让退出的车辆进入"暂时退车道"栈;
    Push(&s2,Acar);
       }
    //如果找到要离开的车辆,则计算并输出停车费用;
    Pop(s, Acar);
    parktime=leavetime-Acar->time;
    money=5*parktime;//此处可根据实际情况变动
    printf("-------------------------------------\n");
    printf("%s的停车时间为%d小时,停车费用为%d元\n",num,parktime,money);
    //将"暂时退车道"栈中的车辆倒回"车库"栈;
    while(!IsEmpty(&s2))
    {
           Pop(&s2,Acar);
           Push(s, Acar);
           }
            // 如果"便道"队列不空,则队头车辆出队,并进入"车库"栈;
           if(!EmptyQueue(Q))
              {
                   Car *Bcar;//出便道进车库的车
                   Bcar=(Car*)malloc(sizeof(Car));
                   DeleteQueue(Q,Bcar);
                   Bcar->time=leavetime;//将"出队车辆"的到达时刻改为"离开车辆"的离开时刻。
                   Push(s,Bcar);
        printf("便道上的%s进入车库,入库时刻为%d,当前停放在车库%d号位\n",Bcar->Number,Bcar->time,s->top+1);
          }
}
/************************************车库停车情况一览表函数***************************************/
void printfstack(SeqStack s)
{
     Car *Ccar;
     Ccar=(Car*)malloc(sizeof(Car));
     if(s.top ==-1)
     printf("车库无车\n");
     else
        {
         while(s.top !=-1)
         {
            *Ccar=s.elem [s.top];
            s.top--;
            printf("%s            %d\n",Ccar->Number,Ccar->time);
         }
    }
}
/********************************便道停车情况一览表函数***************************************/
int printfQueen(LinkQueue  Q)
{ Car *Dcar;
  Dcar=(Car*)malloc(sizeof(Car));
  LinkQueueNode *p;
  p=Q.front->next;
  if(Q.front==Q.rear)
    { printf("便道无车\n");
      return(FALSE);
          }
 while(Q.front!=Q.rear)
{
    *Dcar=p->data;


    if(Q.rear==p)         //如果对中只有一个元素p,则p出对后成为空队
    Q.rear=Q.front;
    printf("%s            %d\n",Dcar->Number,Dcar->time);
    p=p->next;
}
    return(TRUE);
}
/************************************主函数*******************************************/
int main(void)
{   char ch;
    SeqStack  my_stack ;
    LinkQueue  my_queue;
    InitStack(&my_stack );
    InitQueue(&my_queue );
    while(1)
    {
      char t[10];
      printf("*************************************\n");
      printf("   WELCOME TO THE SMART PARKING LOT  \n");
      printf("*************************************\n");
      printf("           请输入车辆信息:          \n");
      printf("            A表示车辆到达           \n");
      printf("            D表示车辆离开           \n");
      printf("            E表示输入结束           \n");
      printf("------------------------------------\n");
      scanf("%s",&t);
      ch=getchar();
      int now;
      char c[10];
      printf("-----------------------\n");
      printf("请输入车牌和当前时刻\n");
      printf("-----------------------\n");
      scanf("%s",c);
      scanf("%d",&now);
      if(t[0]=='A')
     {
         CarArrive(&my_stack,&my_queue, c,now);
         LinkQueueNode *tmp = my_queue.front;


         printf("\n");
     }
    else if(t[0]=='D')
    {
          Carleave(&my_stack,&my_queue,c,now);
          printf("\n");
    }
    else if(t[0]=='E')
    {
        printf("-----------------------------\n");
        printf("当前车库中还有%d辆车,便道上有%d辆车,再见!\n",my_stack.top+1,my_queue.length);
        break;
    }
    printf("+++++++++++++++++++\n");
    printf("车库停车情况一览表:\n");
    printfstack(my_stack);
    printf("便道停车情况一览表:\n");
    printfQueen(my_queue);
    printf("+++++++++++++++++++\n");
    }
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆次序。编制一程序模拟该停车场管理。(2) 实现要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。(2) 实现提示:汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(&rsquo;A&rsquo;,1,5)表示1号牌照车在5时刻到达,而(&rsquo;D&rsquo;,5,20)表示5号牌照车在20时刻离去。整个程序可以在输入信息为(&rsquo;E&rsquo;,0,0)时结束。本题可用顺序存储结构和链式存储结构来实现。本人的一个数据结构课程设计(用C++源码实现,供大家学习参考之用,有不妥之处望指正)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值